package com.asohofrucol.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.asohofrucol.web.LoginController;

/**
 * Servlet Filter implementation class LoginFilter
 */
@WebFilter("/*")
public class LoginFilter implements Filter {

	/**
	 * Default constructor.
	 */
	public LoginFilter() {
		// TODO Auto-generated constructor stub
		System.out.println("LoginFilter");
	}

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

		// Obtengo el bean que representa el usuario desde el scope sesi�n
		LoginController loginController = (LoginController) req.getSession()
				.getAttribute("loginController");

		// Proceso la URL que est� requiriendo el cliente
		String urlStr = req.getRequestURL().toString().toLowerCase();
		boolean freeContent = isFreeContent(urlStr);
		System.out.println(urlStr + " - freeContent=[" + freeContent + "]");

		// Si no requiere protecci�n contin�o normalmente.
		if (isFreeContent(urlStr)) {
			chain.doFilter(request, response);
			return;
		}

		// El usuario no est� logueado
		if (loginController == null || !loginController.isLogin()) {
			res.sendRedirect(req.getContextPath() + "/login.xhtml");
			return;
		}

		// El recurso requiere protecci�n, pero el usuario ya est� logueado.
		chain.doFilter(request, response);
	}

	private boolean isFreeContent(String urlStr) {

		/*
		 * Este es un buen lugar para colocar y programar todos los patrones que
		 * creamos convenientes para determinar cuales de los recursos no
		 * requieren protecci�n. Sin duda que habr�a que crear un mecanizmo tal
		 * que se obtengan de un archivo de configuraci�n o algo que no requiera
		 * compilaci�n.
		 */
		if (urlStr.indexOf("/login.xhtml") != -1)
			return true;
		if (urlStr.indexOf("/templates") != -1)
			return true;
		if (urlStr.indexOf("/javax.faces.resource/") != -1)
			return true;
		if (urlStr.indexOf("/css/") != -1)
			return true;
		if (urlStr.indexOf("/images/") != -1)
			return true;
		if (urlStr.indexOf("/js/") != -1)
			return true;
		return false;
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}
